package org.shj.zookeeper.lock;

import java.util.concurrent.CountDownLatch;

/**
 * zookeeper 分布式锁的实现：
 * 1. 多台机器向 zookeeper 提交创建同名 EPHEMERAL_SEQUENTIAL 节点的请求
 * 2. zookeeper 会为每个请求创建目录，目录名为请求的名字加上10位的流水号， 不足 10 位补0
 * 3. 流水号最小的那台机器获得锁。
 * 4. 流水号较高的监听比他小一点的临时目录的状态。
 * 
 * @author Administrator
 *
 */
public class LockDemo {
	private static final int THREAD_NUM = 10; 
	public static   CountDownLatch threadSemaphore = new CountDownLatch(THREAD_NUM);
	
	public static void main(String[] args) {
		for(int i=0; i < THREAD_NUM; i++){ // 多个线程模拟多台机器
            final int threadId = i;
            new Thread(){
                @Override
                public void run() {
                    try{
                    	 new LockService().doService(new DoTemplate() {
							@Override
							public void dodo() {
								System.out.println("我要修改一个文件。。。。"+threadId);
							}
						});
                    } catch (Exception e){
                    	System.out.println("【第"+threadId+"个线程】 抛出的异常：");
                        e.printStackTrace();
                    }
                }
            }.start();
        }
        try {
        	threadSemaphore.await();
            System.out.println("所有线程运行结束!");
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
}
